Common Socket Options: SO_REUSEADDR, SO_KEEPALIVE, SO_LINGER

Computer Programming - ইউনিক্স সকেট (Unix Socket) Socket Options এবং Control (Socket Options and Control) |
248
248

Common Socket Options হলো Socket-এর বিভিন্ন বৈশিষ্ট্য, যা setsockopt() এবং getsockopt() ফাংশন ব্যবহার করে কনফিগার করা যায়। এগুলো Socket-এর আচরণ কাস্টমাইজ করতে এবং নেটওয়ার্ক অ্যাপ্লিকেশনগুলোর কর্মক্ষমতা এবং স্থায়িত্ব নিশ্চিত করতে সহায়ক। এখানে SO_REUSEADDR, SO_KEEPALIVE, এবং SO_LINGER এই তিনটি গুরুত্বপূর্ণ অপশন নিয়ে আলোচনা করা হলো।

1. SO_REUSEADDR

SO_REUSEADDR অপশন Socket-কে পুনরায় ব্যবহার করতে দেয়, বিশেষত যখন একটি Socket দ্রুত নতুনভাবে Binding করতে হয়। এটি সাধারণত সার্ভার প্রোগ্রামিংয়ে ব্যবহৃত হয়, যেখানে পূর্ববর্তী সংযোগ থেকে Address বা Port ব্যস্ত থাকলে এটি মুক্ত করে নতুন সংযোগের জন্য ব্যবহৃত হতে দেয়।

ব্যবহার:

  • সার্ভার পুনরায় চালানোর সময় যদি পুরোনো Address বা Port Release না হয়, তবে SO_REUSEADDR সেট করে Address পুনরায় ব্যবহার করা যায়।
  • এটি ডেভেলপমেন্ট এবং টেস্টিং-এর সময় খুবই কার্যকর।

উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080

int main() {
    int server_fd;
    struct sockaddr_in server_addr;

    // Server socket তৈরি করা
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // SO_REUSEADDR অপশন সেট করা
    int opt = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
        perror("setsockopt failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // Server address সেটআপ করা
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // Binding করা
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is running with SO_REUSEADDR option enabled.\n");

    close(server_fd);
    return 0;
}

2. SO_KEEPALIVE

SO_KEEPALIVE অপশন সক্রিয় করলে TCP সংযোগগুলোর জন্য Keep-alive প্যাকেট পাঠানো হয়, যা সংযোগ জীবিত (alive) রয়েছে কিনা তা যাচাই করতে সহায়ক। এটি দীর্ঘমেয়াদী সংযোগগুলোর ক্ষেত্রে ব্যবহৃত হয়, যেখানে সংযোগ দীর্ঘ সময় ধরে সক্রিয় রাখতে হয়।

ব্যবহার:

  • সার্ভার-সাইড অ্যাপ্লিকেশনগুলোর জন্য এটি গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করে যে ক্লায়েন্ট সংযোগ সক্রিয় আছে এবং কোনো সমস্যায় পড়লে সংযোগ বন্ধ হয়ে যাবে।
  • এটি Idle সংযোগগুলোকে পরিচালনা করতে সহায়ক, যাতে কোনো সংযোগ হঠাৎ বন্ধ হয়ে গেলে সার্ভার সঠিকভাবে প্রতিক্রিয়া জানাতে পারে।

উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080

int main() {
    int server_fd;
    struct sockaddr_in server_addr;

    // Server socket তৈরি করা
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // SO_KEEPALIVE অপশন সেট করা
    int opt = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)) < 0) {
        perror("setsockopt failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // Server address সেটআপ করা
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // Binding করা
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is running with SO_KEEPALIVE option enabled.\n");

    close(server_fd);
    return 0;
}

3. SO_LINGER

SO_LINGER অপশন ব্যবহার করে Socket বন্ধ করার সময় কিভাবে আচরণ করবে তা নির্ধারণ করা যায়। এটি Linger (অপেক্ষার) সময় নির্ধারণ করে, অর্থাৎ Socket বন্ধ হওয়ার সময় কতক্ষণ অপেক্ষা করবে, যাতে সব ডেটা সঠিকভাবে পাঠানো যায়।

ব্যবহার:

  • এটি নিশ্চিত করে যে, Socket বন্ধ করার সময় পেন্ডিং ডেটা সঠিকভাবে পাঠানো হয়েছে।
  • যদি Linger সময়কাল নির্ধারণ করা হয় এবং ডেটা পাঠানো শেষ না হয়, তবে Socket সেই সময় পর্যন্ত খোলা থাকে।
  • যদি Linger সময় 0 করা হয়, তবে ডেটা পেন্ডিং থাকলেও Socket অবিলম্বে বন্ধ হয়ে যায়।

উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080

int main() {
    int server_fd;
    struct sockaddr_in server_addr;

    // Server socket তৈরি করা
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // SO_LINGER অপশন সেট করা
    struct linger linger_opt;
    linger_opt.l_onoff = 1;   // Linger সক্রিয় করা
    linger_opt.l_linger = 10; // 10 সেকেন্ড পর্যন্ত অপেক্ষা

    if (setsockopt(server_fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)) < 0) {
        perror("setsockopt failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // Server address সেটআপ করা
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // Binding করা
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is running with SO_LINGER option enabled.\n");

    close(server_fd);
    return 0;
}
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion